#!/bin/bash
# 使用方法
## mysql_backup.sh
	#crontab -e
	#每天凌晨3点全量备份mysql,并且把sql备份文件同步到备份服务器上。异地容灾，有备无患！
	#0 3 * * * /root/mysql_backup.sh

## binlog_backup.sh
	#crontab -e
	#-e      (编辑工作表)
  #-l      (列出工作表里的命令)
  #-r      (删除工作作)
	#每30分钟自动备份binglog增量mysql数据文件,并且把binlog备份文件同步到备份服务器上。异地容灾，有备无患！这个备份频率可自己根据项目情况调整。
	#*/30 * * * * /root/mysql_backup.sh


# mysql 数据库备份脚本
# 要备份的ip 账号 密码
# 一定要确保权限够,否则会有各种奇葩问题
# 假如要备份多个地方的数据库,启用多个脚本就可以
db_user="root"
db_password="123456"
db_host="localhost"
db_host_name="本机"


# 存放备份压缩包的文件夹
backup_dir="/data/mysqlback/real/"
backup_dir_temporary="/data/mysqlback/temporary"


# 要备份的数据库名 #
#all_db="$(${mysql} -u ${db_user} -h ${db_host} -p${db_password} -Bse 'show databases')" #
# 多个数据库用空格隔开
#all_db="mmmsss heip"
all_db="mmmsss"

# 要保留的备份天数 #
backup_day=10

#数据库备份日志文件存储的路径
logfile="/var/log/mysql_backup.log"
#---------------------------------------------------------
# mysql日志,配置暂时没有用到
###ssh端口号###
ssh_port=1204
###定义ssh auto key的文件###
id_rsa=/root/auth_key/id_rsa_153.141.rsa
###定义ssh auto username###
id_rsa_user=rsync
###定义要同步的远程服务器的目录路径（必须是绝对路径）###
clientPath="/home/backup/mysql"
###定义要镜像的本地文件目录路径 源服务器（必须是绝对路径）###
serverPath=${backup_dir}
###定义生产环境的ip###
web_ip="192.168.0.2"
#----------------------------------------------------------
# 年月日
time="$(date +"%Y-%m-%d-%H-%M-%S")"

#命令执行 前戳 本机安装没有环境变量 添加 具体执行路径,目前使用的是docker容器内的mysqldump
dockername="mysql"
mysql="docker exec $dockername mysqldump mysql"
mysqldump="docker exec $dockername mysqldump"

# 创建备份文件夹
test ! -d ${backup_dir} && mkdir -p ${backup_dir}
test ! -d ${backup_dir_temporary} && mkdir -p ${backup_dir_temporary}

#备份数据库函数#
mysql_backup(){
    # 取所有的数据库名 #
    for db in ${all_db}
    do
        # 备份文件名拼接 主机名+数据库名+年月日
        backname=${db_host_name}_${db}.${time}
        # 拼接备份文件的绝对路径
        dumpfile=${backup_dir}${backname}
        #将备份的时间、数据库名存入日志
        echo "开始备份mysql数据库,当前时间:"$(date +'%Y-%m-%d %T')" 备份主机:"${db_host_name}" 备份数据库名:"${db}" 输出日志:" >>${logfile}
        # todo 命令需要待优化
        ${mysqldump} -F -u${db_user} -h${db_host} -p${db_password} ${db} > ${dumpfile}.sql 2>>${logfile} 2>&1
        
        #开始将压缩数据日志写入log
        echo "压缩时间"$(date +'%Y-%m-%d %T')"压缩文件并删除sql:${dumpfile}.sql" >>${logfile}
        #将备份数据库文件库压成ZIP文件，并删除先前的SQL文件. #
        tar -czvf ${backname}.tar.gz ${backname}.sql 2>&1 && rm ${dumpfile}.sql 2>>${logfile} 2>&1 
        
        #将压缩后的文件名存入日志。
        echo "备份完成! 备份文件名:"${dumpfile}".tar.gz" >>${logfile}
        echo -e "备份完成! 时间:"$(date +'%Y-%m-%d %T')" 备份主机:"${db_host_name}" 数据库名:"${db}"" >>${logfile}
    done
}

delete_old_backup(){
    echo "删除超时备份文件:" >>${logfile}
    # 删除旧的备份 查找出当前目录下七天前生成的文件，并将之删除
    find ${backup_dir_temporary} -type f -mtime +${backup_day} | tee delete_list.log | xargs rm -rf
    cat delete_list.log >>${logfile}
}

rsync_mysql_backup(){
    # rsync 同步到其他Server中 #
    for j in ${web_ip}
    do                
        echo "mysql_backup_rsync to ${j} begin at "$(date +'%Y-%m-%d %T') >>${logfile}
        ### 同步 ###
        rsync -avz --progress --delete $serverPath -e "ssh -p "${ssh_port}" -i "${id_rsa} ${id_rsa_user}@${j}:$clientPath >>${logfile} 2>&1 
        echo "mysql_backup_rsync to ${j} done at "$(date +'%Y-%m-%d %T') >>${logfile}
    done
}
back_temporary(){
  #单个脚本可以直接运行,如果备份多个,不适用
  #  filename=$(ls $backup_dir | grep gz)
  filename=$(find $backup_dir -type f -mtime +1 | grep -w tar.gz)
  for file in $filename
  do
    echo "移动备份文件名: ${file} ----> temporary" >>${logfile}
    mv "${file}" $backup_dir_temporary
  done

}
#进入数据库备份文件目录
echo "开始备份!"
echo "输出文件夹:"${backup_dir}
cd ${backup_dir} || exit
echo -e "========================开始备份数据库!"$(date +'%Y-%m-%d %T')"============================">>${logfile}

back_temporary
mysql_backup
delete_old_backup
#rsync_mysql_backup
echo -e "========================备份完成!"$(date +'%Y-%m-%d %T')"============================\n\n">>${logfile}

echo "备份完成!"